JavaScript์ Temporal API๋ฅผ ์ฌ์ฉํ ๋ฌ๋ ฅ ๋ณํ์ ๋ํ ์ฌ์ธต ๋ถ์์ ๋๋ค. ๋ค์ํ ๋ฌ๋ ฅ ์์คํ ๊ฐ์ ์ ํํ ๋ ์ง ๋งคํ์ ๊ตฌํํ๊ณ ์ด์ฌ๋๋ ฅ, ํ๋ธ๋ฆฌ๋ ฅ, ๋ถ๊ต๋ ฅ ๋ฑ์ ๋ ์ง ์ฒ๋ฆฌ ๋ฐฉ๋ฒ์ ๋ฐฐ์ฐ์ธ์.
JavaScript Temporal ๋ฌ๋ ฅ ๋ณํ: ์ฌ๋ฌ ๋ฌ๋ ฅ ๊ฐ์ ๋ ์ง ๋งคํ ๋ง์คํฐํ๊ธฐ
์ธ์์ ๊ทธ๋ ๊ณ ๋ฆฌ๋ ฅ๋ง์ผ๋ก ์ด์๋์ง ์์ต๋๋ค. ์ ์ธ๊ณ๋ก ์ฌ์ ์ ํ์ฅํ๋ ๊ธฐ์ ๋ค์ ๊ฐ๊ธฐ ๋ค๋ฅธ ๋ฌธํ ๋ฐ ์ข ๊ต์ ๊ธฐ๋ ์ผ์ ๊ณ ๋ คํด์ผ ํ๋ฉฐ, ์ด๋ ํน์ ๋ฌ๋ ฅ ์์คํ ๊ณผ ์ฐ๊ฒฐ๋์ด ์์ต๋๋ค. JavaScript์ ์ต์ Temporal API๋ ์ด๋ฌํ ๋ณต์ก์ฑ์ ์ฒ๋ฆฌํ ์ ์๋ ๊ฐ๋ ฅํ ๋๊ตฌ๋ฅผ ์ ๊ณตํ์ฌ, ๊ฐ๋ฐ์๊ฐ ์ฌ๋ฌ ๋ฌ๋ ฅ ๊ฐ์ ๋ ์ง๋ฅผ ์ํํ๊ฒ ๋งคํํ๊ณ ์ ํํ ์ผ์ ๊ด๋ฆฌ, ๊ณ์ฐ ๋ฐ ๋ฐ์ดํฐ ํ์๋ฅผ ๋ณด์ฅํ ์ ์๋๋ก ํฉ๋๋ค. ์ด ์ข ํฉ ๊ฐ์ด๋์์๋ Temporal API์ ๋ฌ๋ ฅ ๋ณํ ๊ธฐ๋ฅ์ ์ดํด๋ณด๊ณ , ๊ธ๋ก๋ฒ ์ธ์์ด ๊ฐ๋ฅํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๊ธฐ ์ํ ์ค์ฉ์ ์ธ ์์ ์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ ๊ณตํฉ๋๋ค.
์ฌ๋ฌ ๋ฌ๋ ฅ ๊ฐ ๋ ์ง ๋งคํ์ ํ์์ฑ ์ดํดํ๊ธฐ
๊ธฐ์กด JavaScript `Date` ๊ฐ์ฒด๋ ๊ทธ๋ ๊ณ ๋ฆฌ๋ ฅ์ด ์๋ ๋ฌ๋ ฅ์ ์ฒ๋ฆฌํ๋ ๋ฐ ํ๊ณ๊ฐ ์์ต๋๋ค. Temporal API๋ ๋ค์ํ ๋ฌ๋ ฅ ์์คํ ๊ณผ ํจ๊ป ์๋ํ๋ ํ์คํ๋๊ณ ๊ฒฌ๊ณ ํ ๋ฐฉ๋ฒ์ ์ ๊ณตํ์ฌ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค. ๋ค์ ์๋๋ฆฌ์ค๋ฅผ ๊ณ ๋ คํด ๋ณด์ธ์:
- ๊ตญ์ ํ์ ์ผ์ ์ก๊ธฐ: ๊ทธ๋ ๊ณ ๋ฆฌ๋ ฅ์ผ๋ก ์์ ๋ ์ด๋ฒคํธ์ ํด๋นํ๋ ๋ ์ง๋ฅผ ์ด์ฌ๋(ํ์ฆ๋ผ)๋ ฅ์ด๋ ํ๋ธ๋ฆฌ๋ ฅ์ผ๋ก ์ ํํ๊ฒ ํ์ ํ๋ ๊ฒ์ ์ข ๊ต์ ํด์ผ๊ณผ ๋ฌธํ์ ๋ฏผ๊ฐ์ฑ์ ์กด์คํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค.
- ๋ค๋ฅธ ์ง์ญ์ ๋์ถ ์ด์ ๊ณ์ฐ: ์ผ๋ถ ๊ธ์ต ๊ธฐ๊ด์ ์ด์ ๊ณ์ฐ์ ํน์ ๋ฌ๋ ฅ์ ์ฌ์ฉํฉ๋๋ค. Temporal์ ์ฌ์ฉํ๋ฉด ์ด๋ฌํ ์์คํ ์์ ์ ํํ ๋ ์ง ์ฐ์ฐ์ด ๊ฐ๋ฅํฉ๋๋ค.
- ์ฌ์ฉ์ ์ ํธ ํ์์ผ๋ก ๋ ์ง ํ์: ์ฌ์ฉ์์ ๋ก์ผ์ผ๊ณผ ๋ฌ๋ ฅ ์ ํธ๋์ ๋ง์ถฐ ๋ ์ง ํ์๋ฅผ ์กฐ์ ํ๋ฉด ํนํ ๋ค์ํ ์ธ๊ตฌ๋ฅผ ๋์์ผ๋ก ํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ์ฉ์ ๊ฒฝํ์ด ํฅ์๋ฉ๋๋ค.
- ๊ณผ๊ฑฐ ๋ฐ์ดํฐ ๋ถ์: ๊ณผ๊ฑฐ ๋ฐ์ดํฐ ์ธํธ๋ก ์์ ํ ๋, ์ค๋๋๊ฑฐ๋ ๋ ์ผ๋ฐ์ ์ธ ๋ฌ๋ ฅ์ผ๋ก ๊ธฐ๋ก๋ ๋ ์ง๋ฅผ ์ดํดํ๊ณ ๋ณํํ๋ ๊ฒ์ ์ ํํ ํด์์ ์ํด ํ์์ ์ ๋๋ค.
Temporal API์ ๋ฌ๋ ฅ ์๊ฐ
์ต์ JavaScript ํ๊ฒฝ์์ ๋๋ฆฌ ์ง์๋๋ Temporal API๋ ๋ ์ง, ์๊ฐ ๋ฐ ์๊ฐ๋๋ฅผ ๋ค๋ฃจ๋ ๋ ์ง๊ด์ ์ด๊ณ ๊ฐ๋ ฅํ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ํต์ฌ์ ์ผ๋ก `Temporal.Calendar` ๊ฐ์ฒด๋ ํน์ ๋ฌ๋ ฅ ์์คํ ์ ๋ํ๋ ๋๋ค. Temporal.PlainDate, Temporal.PlainDateTime ๋ฐ ๊ธฐํ Temporal ํ์ ์ `Temporal.Calendar` ์ธ์คํด์ค์ ์ฐ๊ฒฐ๋ ์ ์์ต๋๋ค.
Temporal API๋ ํ์ฌ (์ด ๊ธ์ ์ฐ๋ ์์ ์์) ๋ค์ ๋ฌ๋ ฅ์ ์ง์ํฉ๋๋ค:
- `iso8601` (๊ทธ๋ ๊ณ ๋ฆฌ๋ ฅ - ๊ธฐ๋ณธ๊ฐ)
- `gregory` (`iso8601`์ ๋ณ์นญ)
- `islamic`
- `islamic-umalqura`
- `islamic-tbla`
- `islamic-rgsa`
- `islamic-civil`
- `hebrew`
- `buddhist`
- `roc` (์คํ๋ฏผ๊ตญ๋ ฅ)
- `japanese`
- `persian`
ํฅํ ๋ฒ์ ์์๋ ๋ ๋ง์ ๋ฌ๋ ฅ์ด ๋์ ๋๊ฑฐ๋ ์ฌ์ฉ์ ์ง์ ๋ฌ๋ ฅ ๊ตฌํ์ด ํ์ฉ๋ ์ ์์ต๋๋ค.
Temporal.PlainDate๋ฅผ ์ฌ์ฉํ ๊ธฐ๋ณธ ๋ฌ๋ ฅ ๋ณํ
`Temporal.PlainDate` ๊ฐ์ฒด๋ ์๊ฐ๋ ์๋ ๋ ์ง๋ฅผ ๋ํ๋ ๋๋ค. ํน์ ๋ฌ๋ ฅ๊ณผ ์ฐ๊ฒฐ๋ `Temporal.PlainDate`๋ฅผ ์์ฑํ ์ ์์ต๋๋ค:
const gregorianDate = Temporal.PlainDate.from('2024-01-20');
const islamicCalendar = Temporal.Calendar.from('islamic');
const islamicDate = Temporal.PlainDate.from({ year: 1445, month: 6, day: 8, calendar: islamicCalendar });
console.log(gregorianDate.toString()); // ์ถ๋ ฅ: 2024-01-20
console.log(islamicDate.toString()); // ์ถ๋ ฅ: 1445-06-08[u-ca=islamic]
`toString()` ๋ฉ์๋๋ ๋ฌ๋ ฅ ์ฃผ์ `[u-ca=islamic]`๊ณผ ํจ๊ป ๋ ์ง๋ฅผ ์ถ๋ ฅํฉ๋๋ค. ์ด๋ ํด๋น ๋ ์ง๊ฐ ์ด์ฌ๋๋ ฅ๊ณผ ๊ด๋ จ์ด ์์์ ๋ํ๋ ๋๋ค.
๋ฌ๋ ฅ ๊ฐ ๋ณํํ๊ธฐ
๋ฌ๋ ฅ ๊ฐ ๋ณํ์ ํต์ฌ์ ๊ฐ ๋ฌ๋ ฅ๊ณผ ๊ด๋ จ๋ `Temporal.PlainDate` ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋ค์ ๊ฐ ๋ ์ง ๊ตฌ์ฑ ์์๋ฅผ ์ถ์ถํ๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ ๊ณ ๋ฆฌ๋ ฅ ๋ ์ง๋ฅผ ์ด์ฌ๋๋ ฅ์ ํด๋น ๋ ์ง๋ก ๋ณํํ๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
const gregorianDate = Temporal.PlainDate.from('2024-01-20');
const islamicCalendar = Temporal.Calendar.from('islamic');
// ์ด์ฌ๋๋ ฅ์ ๋ ์ง ๊ตฌ์ฑ ์์ ์ถ์ถ
const islamicYear = gregorianDate.toPlainDate(islamicCalendar).year;
const islamicMonth = gregorianDate.toPlainDate(islamicCalendar).month;
const islamicDay = gregorianDate.toPlainDate(islamicCalendar).day;
console.log(`Gregorian: ${gregorianDate.toString()}`);
console.log(`Islamic: ${islamicYear}-${islamicMonth}-${islamicDay}`); // ์ถ๋ ฅ: Islamic: 1445-6-8
์ด ์์ ๋ฅผ ๋ถ์ํด ๋ณด๊ฒ ์ต๋๋ค:
- `gregorianDate`๋ฅผ `Temporal.PlainDate` ๊ฐ์ฒด๋ก ํํํ์ฌ ์์ํฉ๋๋ค.
- `Temporal.Calendar.from('islamic')`๋ฅผ ์ฌ์ฉํ์ฌ `islamicCalendar` ๊ฐ์ฒด๋ฅผ ์์ฑํฉ๋๋ค.
- ํต์ฌ ๋ณํ์ `gregorianDate.toPlainDate(islamicCalendar)`์์ ๋ฐ์ํฉ๋๋ค. ์ด๊ฒ์ ๋์ผํ ์์ ์ ๋ํ๋ด์ง๋ง ์ด์ ์ด์ฌ๋๋ ฅ๊ณผ ์ฐ๊ฒฐ๋ ์๋ก์ด `Temporal.PlainDate` ๊ฐ์ฒด๋ฅผ ์์ฑํฉ๋๋ค.
- ๋ณํ๋ `Temporal.PlainDate` ๊ฐ์ฒด์์ `year`, `month`, `day` ๊ตฌ์ฑ ์์๋ฅผ ์ถ์ถํฉ๋๋ค.
Temporal API์์ ์ง์ํ๋ ๋ ๋ฌ๋ ฅ ๊ฐ์ ๋ณํํ๊ธฐ ์ํด ์ด ํจํด์ ์ ์ฉํ ์ ์์ต๋๋ค.
๊ณ ๊ธ ๋ฌ๋ ฅ ์ฒ๋ฆฌ: ์ด์ฌ๋๋ ฅ
์ด์ฌ๋๋ ฅ์๋ ์ฌ๋ฌ ๋ณํ์ด ์์ต๋๋ค. Temporal API๋ ๋ค์์ ์ง์ํฉ๋๋ค:
- `islamic`: ์ผ๋ฐ์ ์ธ ์ด์ฌ๋๋ ฅ (๊ตฌํ์ ๋ค๋ฅผ ์ ์์).
- `islamic-umalqura`: ์ฌ์ฐ๋์๋ผ๋น์์ ์ ์์ฟ ๋ผ๋ ฅ ๊ธฐ๋ฐ.
- `islamic-tbla`: ํ ๊ณ์ฐ ๊ธฐ๋ฐ.
- `islamic-rgsa`: ์ด์งํธ ์ข ๊ต๋ถ ์ฐํ ์ฌ๋ฌด๊ตญ ๊ธฐ๋ฐ.
- `islamic-civil`: ์ฃผ๋ก ๊ณ์ฐ์ ์ฌ์ฉ๋๋ ์์ ์ฐ์ ๋ฒ์ ์ ์ด์ฌ๋๋ ฅ.
์ด์ฌ๋๋ ฅ์ผ๋ก ์์ ํ ๋๋ ์ฌ์ฉ ์ฌ๋ก์ ์ด๋ค ๋ณํ์ด ์ ํฉํ์ง ์ดํดํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ฌ์ฐ๋์๋ผ๋น์์ ์ข ๊ต์ ๊ธฐ๋ ์ผ์๋ `islamic-umalqura`๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๊ธ์ต ๊ณ์ฐ์ ๊ฒฝ์ฐ ์์ธก ๊ฐ๋ฅ์ฑ ๋๋ฌธ์ `islamic-civil`์ด ๋ ์ ํฉํ ์ ์์ต๋๋ค.
const gregorianDate = Temporal.PlainDate.from('2024-03-11');
const islamicUmalquraCalendar = Temporal.Calendar.from('islamic-umalqura');
const islamicCivilCalendar = Temporal.Calendar.from('islamic-civil');
const islamicUmalquraDate = gregorianDate.toPlainDate(islamicUmalquraCalendar);
const islamicCivilDate = gregorianDate.toPlainDate(islamicCivilCalendar);
console.log(`Gregorian: ${gregorianDate.toString()}`);
console.log(`Islamic (Umm al-Qura): ${islamicUmalquraDate.year}-${islamicUmalquraDate.month}-${islamicUmalquraDate.day}`);
console.log(`Islamic (Civil): ${islamicCivilDate.year}-${islamicCivilDate.month}-${islamicCivilDate.day}`);
์ด์ฌ๋๋ ฅ์ ๋ํ ์ค์ ๊ณ ๋ ค์ฌํญ:
- ์ด์ฌ๋๋ ฅ์์ ์ ๋ฌ์ ์์์ ์ด์น๋ฌ ๊ด์ธก์ ๊ธฐ๋ฐ์ผ๋ก ํฉ๋๋ค. `islamic-umalqura` ๋ฌ๋ ฅ์ ์ฌ์ฐ๋์๋ผ๋น์์ ์ค์ ๋ฌ ๊ด์ธก๊ณผ ์ผ์นํ๋ ๊ฒ์ ๋ชฉํ๋ก ํ์ง๋ง, ์ฌ์ ํ ๋ถ์ผ์น๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
- `islamic-civil` ๋ฌ๋ ฅ์ ์ํ์ ๊ทผ์ฌ์น์ด๋ฉฐ ์ค์ ๋ฌ ๊ด์ธก์ ๋ฐ์ํ์ง ์์ต๋๋ค.
- ์ด์ฌ๋ ํด์ผ์ ์ ํํ ๋ ์ง๋ ํญ์ ๊ด๋ จ ์ข ๊ต ๋น๊ตญ์ด๋ ์ ๋ขฐํ ์ ์๋ ์ถ์ฒ์ ๋ฌธ์ํ์ญ์์ค.
ํ๋ธ๋ฆฌ๋ ฅ์ผ๋ก ์์ ํ๊ธฐ
ํ๋ธ๋ฆฌ๋ ฅ์ ์ ๋๊ต์ ์ข ๊ต์ ๊ธฐ๋ ์ผ์ ์ํด ์ฌ์ฉ๋๋ฉฐ ์ด์ค๋ผ์์ ๊ณต์ ๋ฌ๋ ฅ์ด๊ธฐ๋ ํ ํ์ํ์๋ ฅ์ ๋๋ค. ๊ณ์ ๊ณผ ์ผ์น์ํค๊ธฐ ์ํด ์ค๋ฌ์ ํฌํจํฉ๋๋ค.
const gregorianDate = Temporal.PlainDate.from('2024-03-11');
const hebrewCalendar = Temporal.Calendar.from('hebrew');
const hebrewDate = gregorianDate.toPlainDate(hebrewCalendar);
console.log(`Gregorian: ${gregorianDate.toString()}`);
console.log(`Hebrew: ${hebrewDate.year}-${hebrewDate.month}-${hebrewDate.day}`);
ํ๋ธ๋ฆฌ๋ ฅ ๋ฐ Temporal์ ์ฃผ์ ํน์ง:
- ์ค๋ฌ์ Temporal API์ ์ํด ์๋์ผ๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค. ์ค๋ ์ ๊ฒฐ์ ํ๊ฑฐ๋ ์ถ๊ฐ ๋ฌ์ ๋ํ๊ธฐ ์ํ ์ฌ์ฉ์ ์ง์ ๋ก์ง์ ๊ตฌํํ ํ์๊ฐ ์์ต๋๋ค.
- ์ฐ๋ ๋ฒํธ๋ ์ ํต์ ์ธ ์ ๋๊ต ๊ธฐ์(์ธ์ ์ฐฝ์กฐ)๋ถํฐ ์์๋ฉ๋๋ค.
- ํ๋ธ๋ฆฌ๋ ฅ์ ์ ์ด๋ฆ์ ๊ทธ๋ ๊ณ ๋ฆฌ๋ ฅ๊ณผ ๋ค๋ฆ ๋๋ค. ์ด๋ฌํ ์ ์ด๋ฆ์ ๊ตญ์ ํ(i18n) ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ฌ์ฉ์ ์ง์ ๋งคํ์ ํตํด ์ ๊ทผํ ์ ์์ต๋๋ค.
๋ถ๊ต๋ ฅ, ROC, ์ผ๋ณธ๋ ฅ ๋ฐ ํ๋ฅด์์๋ ฅ ์ฒ๋ฆฌ
Temporal API๋ ๊ฐ๊ฐ ๊ณ ์ ํ ํน์ฑ์ ๊ฐ์ง ๋ค๋ฅธ ๋ฌ๋ ฅ๋ค๋ ์ง์ํฉ๋๋ค. ๋ช ๊ฐ์ง ๊ณ ๋ ค์ฌํญ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ๋ถ๊ต๋ ฅ: ๋ถ๊ต๋ ฅ์ ๋ง์ ๋๋จ์์์ ๊ตญ๊ฐ์์ ์ฌ์ฉ๋๋ ํ์ํ์๋ ฅ์ ๋๋ค. ์ฐ๋ ๋ฒํธ๋ ์ผ๋ฐ์ ์ผ๋ก ๋ถ์ฒ์ ์ด๋ฐ๋ถํฐ ์์๋ฉ๋๋ค.
- ROC๋ ฅ (์คํ๋ฏผ๊ตญ๋ ฅ): ์ด ๋ฌ๋ ฅ์ ๋๋ง์์ ์ฌ์ฉ๋๋ฉฐ 1912๋ ์คํ๋ฏผ๊ตญ ๊ฑด๊ตญ๋ถํฐ ์ฐ๋๋ฅผ ์ ๋๋ค.
- ์ผ๋ณธ๋ ฅ: ์ผ๋ณธ๋ ฅ์ ๊ทธ๋ ๊ณ ๋ฆฌ๋ ฅ์ ๊ธฐ๋ฐ์ผ๋ก ํ์ง๋ง, ์ฐ๋๋ฅผ ๋ํ๋ด๊ธฐ ์ํด ์ผ๋ณธ ์ฐํธ(nengล)๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- ํ๋ฅด์์๋ ฅ: ํ๋ฅด์์๋ ฅ์ ์ฃผ๋ก ์ด๋๊ณผ ์ํ๊ฐ๋์คํ์์ ์ฌ์ฉ๋๋ ํ์๋ ฅ์ ๋๋ค.
const gregorianDate = Temporal.PlainDate.from('2024-03-11');
const buddhistCalendar = Temporal.Calendar.from('buddhist');
const rocCalendar = Temporal.Calendar.from('roc');
const japaneseCalendar = Temporal.Calendar.from('japanese');
const persianCalendar = Temporal.Calendar.from('persian');
const buddhistDate = gregorianDate.toPlainDate(buddhistCalendar);
const rocDate = gregorianDate.toPlainDate(rocCalendar);
const japaneseDate = gregorianDate.toPlainDate(japaneseCalendar);
const persianDate = gregorianDate.toPlainDate(persianCalendar);
console.log(`Gregorian: ${gregorianDate.toString()}`);
console.log(`Buddhist: ${buddhistDate.year}-${buddhistDate.month}-${buddhistDate.day}`);
console.log(`ROC: ${rocDate.year}-${rocDate.month}-${rocDate.day}`);
console.log(`Japanese: ${japaneseDate.year}-${japaneseDate.month}-${japaneseDate.day}`);
console.log(`Persian: ${persianDate.year}-${persianDate.month}-${persianDate.day}`);
์ด๋ฌํ ๋ฌ๋ ฅ์ ์ฌ์ฉํ ๋๋ ํน์ ๊ธฐ์(์์ ์ฐ๋)๊ณผ ๋ ์ง ํํ๊ณผ ๊ด๋ จ๋ ๋ฌธํ์ ๋์์ค๋ฅผ ์ธ์งํด์ผ ํฉ๋๋ค.
Temporal.Now์ ๋ฌ๋ ฅ ๊ณ ๋ ค์ฌํญ
`Temporal.Now`๋ฅผ ์ฌ์ฉํ์ฌ ํ์ฌ ๋ ์ง์ ์๊ฐ์ ๊ฐ์ ธ์ฌ ์ ์์ง๋ง, ๊ธฐ๋ณธ์ ์ผ๋ก ISO 8601 ๋ฌ๋ ฅ์ ํ์ฌ ๋ ์ง์ ์๊ฐ์ ๋ฐํํ๋ค๋ ์ ์ ์ดํดํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ๋ค๋ฅธ ๋ฌ๋ ฅ์ ํ์ฌ ๋ ์ง๊ฐ ํ์ํ ๊ฒฝ์ฐ ๋ณํํด์ผ ํฉ๋๋ค:
const islamicCalendar = Temporal.Calendar.from('islamic');
const now = Temporal.Now.plainDateISO(); // ISO 8601 ๋ฌ๋ ฅ์ ํ์ฌ ๋ ์ง
const islamicNow = now.toPlainDate(islamicCalendar);
console.log(`Current Gregorian Date: ${now.toString()}`);
console.log(`Current Islamic Date: ${islamicNow.year}-${islamicNow.month}-${islamicNow.day}`);
๋ ์ง ์์ ์ง์ ๋ฐ ๊ตญ์ ํ(i18n)
๋ ์ง ๋ณํ์ ๋ฐฉ์ ์์ ์ผ๋ถ์ผ ๋ฟ์ ๋๋ค. ํ์๋ฅผ ์ํด ์ฌ๋ฐ๋ฅด๊ฒ ์์์ ์ง์ ํด์ผ ํฉ๋๋ค. JavaScript์ `Intl.DateTimeFormat` API๋ ๊ฐ๋ ฅํ ๊ตญ์ ํ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ฅผ Temporal API์ ํจ๊ป ์ฌ์ฉํ์ฌ ๊ด๋ จ ๋ฌ๋ ฅ์ ๊ณ ๋ คํ์ฌ ๋ก์ผ์ผ์ ๋ง๋ ๋ฐฉ์์ผ๋ก ๋ ์ง ์์์ ์ง์ ํ ์ ์์ต๋๋ค.
const gregorianDate = Temporal.PlainDate.from('2024-01-20');
const islamicCalendar = Temporal.Calendar.from('islamic');
const islamicDate = gregorianDate.toPlainDate(islamicCalendar);
const formatter = new Intl.DateTimeFormat('ar-SA-u-ca-islamic', { // ์๋์ด(์ฌ์ฐ๋์๋ผ๋น์), ์ด์ฌ๋๋ ฅ ์ฌ์ฉ
year: 'numeric',
month: 'long',
day: 'numeric',
});
console.log(formatter.format(islamicDate)); // ์์ ์ถ๋ ฅ: ูขู ุฑุฌุจุ ูกูคูคูฅ ูู
์ฝ๋๋ฅผ ๋ถ์ํด ๋ณด๊ฒ ์ต๋๋ค:
- `'ar-SA-u-ca-islamic'`๋ ๋ก์ผ์ผ ๋ฌธ์์ด์ ๋๋ค. `ar-SA`๋ ์๋์ด(์ฌ์ฐ๋์๋ผ๋น์)๋ฅผ ์ง์ ํ๊ณ , `u-ca-islamic`์ ์ด์ฌ๋๋ ฅ์ ๋ช ์์ ์ผ๋ก ์์ฒญํฉ๋๋ค.
- `Intl.DateTimeFormat` ์ต์ ์ ๋ ์ง ์์(์ฐ, ์, ์ผ)์ ์ ์ดํฉ๋๋ค.
- `format()` ๋ฉ์๋๋ `Temporal.PlainDate` ๊ฐ์ฒด(์ด ๊ฒฝ์ฐ `islamicDate`)๋ฅผ ๋ฐ์ ์ง์ ๋ ๋ก์ผ์ผ๊ณผ ๋ฌ๋ ฅ์ ๋ฐ๋ผ ์์์ด ์ง์ ๋ ๋ฌธ์์ด์ ๋ฐํํฉ๋๋ค.
ํน์ ์๊ตฌ์ ๋ง๊ฒ ๋ก์ผ์ผ ๋ฌธ์์ด๊ณผ ์์ ์ต์ ์ ์กฐ์ ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋ ์ง๋ฅผ ํ๋ธ๋ฆฌ์ด๋ก ์์์ ์ง์ ํ๋ ค๋ฉด:
const gregorianDate = Temporal.PlainDate.from('2024-03-11');
const hebrewCalendar = Temporal.Calendar.from('hebrew');
const hebrewDate = gregorianDate.toPlainDate(hebrewCalendar);
const formatter = new Intl.DateTimeFormat('he-IL-u-ca-hebrew', { // ํ๋ธ๋ฆฌ์ด(์ด์ค๋ผ์), ํ๋ธ๋ฆฌ๋ ฅ ์ฌ์ฉ
year: 'numeric',
month: 'long',
day: 'numeric',
});
console.log(formatter.format(hebrewDate));
ํจ๊ณผ์ ์ธ ๋ ์ง ์์ ์ง์ ์ ์ํ ํ:
- ์ฌ์ฉ์์ ์ ํธ ์ธ์ด์ ์ง์ญ์ ์ ํํ๊ฒ ๋ฐ์ํ๋ ๋ก์ผ์ผ ๋ฌธ์์ด์ ์ฌ์ฉํ์ญ์์ค.
- ๋ฌธ๋งฅ์ ์ ํฉํ ์์ ์ต์ ์ ์ ํํ์ญ์์ค (์: ๊ฐ๊ฒฐํ ํ์๋ฅผ ์ํ ์งง์ ๋ ์ง ํ์, ์์ธํ ํ๋ ์ ํ ์ด์ ์ ์ํ ๊ธด ๋ ์ง ํ์).
- ์ ํ์ฑ๊ณผ ๊ฐ๋ ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด ๋ค์ํ ๋ก์ผ์ผ์์ ์์์ ํ ์คํธํ์ญ์์ค.
์ฌ๋ฌ ๋ฌ๋ ฅ ๊ฐ์ ๋ ์ง ์ฐ์ฐ ์ํ
Temporal API๋ ๋ ์ง ์ฐ์ฐ์ ํ์ํฉ๋๋ค. ๊ทธ๋ ๊ณ ๋ฆฌ๋ ฅ์ด ์๋ ๋ฌ๋ ฅ์ผ๋ก ์์ ํ ๋๋ `Temporal.PlainDate` ๊ฐ์ฒด์์ ์ผ, ์ ๋๋ ์ฐ๋๋ฅผ ๋ํ๊ฑฐ๋ ๋บ ์ ์์ต๋๋ค.
const gregorianDate = Temporal.PlainDate.from('2024-01-20');
const islamicCalendar = Temporal.Calendar.from('islamic');
const islamicDate = gregorianDate.toPlainDate(islamicCalendar);
// ์ด์ฌ๋ ๋ ์ง์ 30์ผ ๋ํ๊ธฐ
const futureIslamicDate = islamicDate.add({ days: 30 });
console.log(`Original Islamic Date: ${islamicDate.year}-${islamicDate.month}-${islamicDate.day}`);
console.log(`Islamic Date + 30 days: ${futureIslamicDate.year}-${futureIslamicDate.month}-${futureIslamicDate.day}`);
// ๋ฏธ๋์ ์ด์ฌ๋ ๋ ์ง๋ฅผ ๋ค์ ๊ทธ๋ ๊ณ ๋ฆฌ๋ ฅ์ผ๋ก ๋ณํ
const futureGregorianDate = futureIslamicDate.toPlainDate('iso8601');
console.log(`Equivalent Gregorian Date: ${futureGregorianDate.toString()}`);
๋ ์ง ์ฐ์ฐ์ ๋ํ ์ฃผ์ ๊ณ ๋ ค์ฌํญ:
- `add()` ๋ฐ `subtract()` ๋ฉ์๋๋ ์๋ก์ด `Temporal.PlainDate` ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ฉฐ, ์๋ณธ ๊ฐ์ฒด๋ฅผ ์์ ํ์ง ์์ต๋๋ค.
- ์์ด๋ ์ฐ๋๋ฅผ ๋ํ๊ฑฐ๋ ๋บ ๋, Temporal API๋ ์ค๋ ๋ฐ ์ ๊ธธ์ด์ ๋ํ ๋ฌ๋ ฅ๋ณ ๊ท์น์ ์ฒ๋ฆฌํฉ๋๋ค.
- ์ฐ์ฐ์ ์ํํ ๋ ์ ์ฌ์ ์ธ ๋ ์ง ์ค๋ฒํ๋ก์ฐ๋ ์ธ๋ํ๋ก์ฐ์ ์ ์ํ์ญ์์ค. Temporal API๋ ์ผ๋ฐ์ ์ผ๋ก ํด๋น ๋ฌ๋ ฅ ๋ด์์ ๊ฐ์ฅ ๊ฐ๊น์ด ์ ํจํ ๋ ์ง๋ก ์กฐ์ ํฉ๋๋ค.
๋ชจํธํ ๋ ์ง ์ฒ๋ฆฌ
์ด๋ค ๊ฒฝ์ฐ์๋ ๋ฌ๋ ฅ ๊ฐ ๋ณํ ์ ๋ ์ง๊ฐ ๋ชจํธํ ์ ์์ต๋๋ค. ์ด๋ ํน์ ๋ ์ง๊ฐ ๋์ ๋ฌ๋ ฅ์ ์กด์ฌํ์ง ์๊ฑฐ๋ ๋์ ๋ฌ๋ ฅ์ ์ฌ๋ฌ ๋ ์ง๊ฐ ์๋ณธ ๋ ์ง์ ํด๋นํ ์ ์์ ๋ ๋ฐ์ํ ์ ์์ต๋๋ค. Temporal์ ์ด๋ฌํ ์ํฉ์ ์ํํ๊ฒ ์ฒ๋ฆฌํ๋ฉฐ, ์ผ๋ฐ์ ์ผ๋ก ๊ฐ์ฅ ๊ฐ๊น์ด ์ ํจํ ๋ ์ง๋ฅผ ๋ฐํํฉ๋๋ค.
์๋ฅผ ๋ค์ด, ๊ทธ๋ ๊ณ ๋ฆฌ๋ ฅ ์๋ง์ ๊ฐ๊น์ด ๊ทธ๋ ๊ณ ๋ฆฌ๋ ฅ ๋ ์ง๋ฅผ ์ด์ฌ๋๋ ฅ์ผ๋ก ๋ณํํ๋ ๊ฒฝ์ฐ, ํด๋น ์ด์ฌ๋๋ ฅ ์์ด ๋ ์งง์ ์ ์์ต๋๋ค. Temporal์ ๊ฒฐ๊ณผ์ ์ธ ์ด์ฌ๋ ๋ ์ง๋ฅผ ํด๋น ์์ ๋ง์ง๋ง ๋ ๋ก ์๋ ์กฐ์ ํฉ๋๋ค.
์ค๋ฅ ์ฒ๋ฆฌ ๋ฐ ์ ํจ์ฑ ๊ฒ์ฌ
Temporal API๋ ๊ฒฌ๊ณ ํ์ง๋ง, ์๊ธฐ์น ์์ ๋์์ ๋ฐฉ์งํ๊ธฐ ์ํด ์ ์ ํ ์ค๋ฅ ์ฒ๋ฆฌ ๋ฐ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ๊ตฌํํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ๊ณ ๋ คํด์ผ ํ ๋ช ๊ฐ์ง ์ผ๋ฐ์ ์ธ ์๋๋ฆฌ์ค๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ์๋ชป๋ ๋ฌ๋ ฅ ์ด๋ฆ: `Temporal.Calendar.from()`์ ์๋ชป๋ ๋ฌ๋ ฅ ์ด๋ฆ์ ์ ๊ณตํ๋ฉด `RangeError`๊ฐ ๋ฐ์ํฉ๋๋ค. ์ด ์ค๋ฅ๋ฅผ ํฌ์ฐฉํ๊ณ ์ฌ์ฉ์ ์นํ์ ์ธ ๋ฉ์์ง๋ฅผ ์ ๊ณตํ์ญ์์ค.
- ์๋ชป๋ ๋ ์ง ํ์: ์๋ชป๋ ๋ ์ง ๋ฌธ์์ด๋ก `Temporal.PlainDate`๋ฅผ ๋ง๋ค๋ ค๊ณ ํ๋ฉด `RangeError`๊ฐ ๋ฐ์ํฉ๋๋ค. `Temporal.PlainDate.from()`์ ์ ๋ฌํ๊ธฐ ์ ์ ๋ ์ง ๋ฌธ์์ด์ ์ ํจ์ฑ์ ๊ฒ์ฌํ์ญ์์ค.
- ์ง์๋์ง ์๋ ์์ : ์ผ๋ถ ๋ฌ๋ ฅ๋ณ ์์ ์ Temporal API์์ ์ง์๋์ง ์์ ์ ์์ต๋๋ค. ์ฌ์ฉ ์ค์ธ ํน์ ๋ฌ๋ ฅ์ ๋ํ ์ค๋ช ์๋ฅผ ํ์ธํ์ญ์์ค.
์ฌ๋ฌ ๋ฌ๋ ฅ ๊ฐ ๋ ์ง ๋งคํ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
์ฌ๋ฌ ๋ฌ๋ ฅ ๊ฐ ๋ ์ง ๋งคํ ์์ ์ ์ ํ์ฑ๊ณผ ์ ์ง ๊ด๋ฆฌ์ฑ์ ๋ณด์ฅํ๋ ค๋ฉด ๋ค์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด์ญ์์ค:
- Temporal API ์ฌ์ฉ: Temporal API๋ ๋ฌ๋ ฅ ๋ณํ์ ์ฒ๋ฆฌํ๋ ํ์คํ๋๊ณ ๊ฒฌ๊ณ ํ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ์ด ๋ชฉ์ ์ ์ํด ๋ ๊ฑฐ์ JavaScript `Date` ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ง ๋ง์ญ์์ค.
- ๋ฌ๋ ฅ์ ๋ช ์์ ์ผ๋ก ์ง์ : `Temporal.PlainDate` ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋ ํญ์ ๋ฌ๋ ฅ์ ๋ช ์์ ์ผ๋ก ์ง์ ํ์ญ์์ค. ์ด๋ ๋ชจํธ์ฑ์ ๋ฐฉ์งํ๊ณ ์ฌ๋ฐ๋ฅธ ๋ฌ๋ ฅ ๊ท์น์ด ์ ์ฉ๋๋๋ก ๋ณด์ฅํฉ๋๋ค.
- ์ฌ๋ฐ๋ฅธ ์ด์ฌ๋๋ ฅ ๋ณํ ์ ํ: ๋ค์ํ ์ด์ฌ๋๋ ฅ ๊ตฌํ ๊ฐ์ ์ฐจ์ด์ ์ ์ดํดํ๊ณ ์ฌ์ฉ ์ฌ๋ก์ ๊ฐ์ฅ ์ ํฉํ ๊ฒ์ ์ ํํ์ญ์์ค.
- ๊ตญ์ ํ(i18n) ์ฌ์ฉ: `Intl.DateTimeFormat` API๋ฅผ ํ์ฉํ์ฌ ๋ก์ผ์ผ์ ๋ง๋ ๋ฐฉ์์ผ๋ก ๋ ์ง ์์์ ์ง์ ํ์ญ์์ค.
- ์ค๋ฅ ์ฒ๋ฆฌ ๊ตฌํ: ์๋ชป๋ ๋ฌ๋ ฅ ์ด๋ฆ, ๋ ์ง ํ์ ๋ฐ ๊ธฐํ ์ ์ฌ์ ์ธ ๋ฌธ์ ๋ฅผ ํฌ์ฐฉํ๊ธฐ ์ํด ๊ฐ๋ ฅํ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ๊ตฌํํ์ญ์์ค.
- ์ฒ ์ ํ ํ ์คํธ: ์ ํ์ฑ๊ณผ ํธํ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด ๋ค์ํ ๋ ์ง์ ๋ก์ผ์ผ๋ก ์ฝ๋๋ฅผ ํ ์คํธํ์ญ์์ค.
- ์ต์ ์ ๋ณด ์ ์ง: Temporal API๋ ๊ณ์ ๋ฐ์ ํ๊ณ ์์ต๋๋ค. ์ต์ ์ฌ์๊ณผ ๋ธ๋ผ์ฐ์ ๊ตฌํ์ ๋ํ ์ต์ ์ ๋ณด๋ฅผ ์ ์งํ์ญ์์ค.
๊ฒฐ๋ก
JavaScript์ Temporal API๋ ๋ ์ง์ ๋ฌ๋ ฅ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ ํ์ ํ์ฌ, ์ฌ๋ฌ ๋ฌ๋ ฅ ๊ฐ์ ๋ ์ง ๋งคํ์ ์ํํ๋ ๊ฐ๋ ฅํ๊ณ ํ์คํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ๋ค์ํ ๋ฌ๋ ฅ ์์คํ ์ ๋ฏธ๋ฌํ ์ฐจ์ด๋ฅผ ์ดํดํ๊ณ Temporal API๋ฅผ ํจ๊ณผ์ ์ผ๋ก ํ์ฉํจ์ผ๋ก์จ ๊ฐ๋ฐ์๋ ๋ค์ํ ๋ฌธํ ๋ฐ ์ข ๊ต์ ์๊ตฌ์ ๋ถ์ํ๋ ๊ธ๋ก๋ฒ ์ธ์์ด ๊ฐ๋ฅํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ ์ ์์ต๋๋ค. ํ๋ก์ ํธ์์ ๋ ํฌ๊ด์ ์ด๊ณ ์ ํํ ๋ ์ง ์ฒ๋ฆฌ ์๋ฃจ์ ์ ๋ง๋ค๊ธฐ ์ํด Temporal API๋ฅผ ๋์ ํ์ญ์์ค.
์ด ๊ฐ์ด๋๋ JavaScript Temporal API๋ฅผ ์ฌ์ฉํ ๋ฌ๋ ฅ ๋ณํ์ ๋ํ ํฌ๊ด์ ์ธ ๊ฐ์๋ฅผ ์ ๊ณตํ์ต๋๋ค. ๊ฐ์ฅ ์ต์ ์ ๋ณด์ ์์ธํ ์ฌ์์ ๊ณต์ Temporal API ์ค๋ช ์๋ฅผ ์ฐธ์กฐํ์ญ์์ค.